package classes.stringbuffer;

/**
 * @author : DuJiabao
 * @Date : 2021/1/21 11:17
 * @Project : java_learning
 * @File : null.java
 * @Desc :
 */

import org.junit.Test;

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;

/**
 * 字符串常量保存在常量池。
 * "" 初始化，该变量直接指向字符串常量
 * new String（）之后，首先将实例化对象保存在堆，再指向常量池的字符串常量。
 */
public class StringTest {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        String s4 = new String("abc");
//        比较地址
        System.out.println(s1 == s2);  // true
        System.out.println(s1 == s3);  // false
        System.out.println(s3 == s4);  //false
    }

    @Test
    public void test() {
        String s = "hello world";
//      int length()：返回字符串的长度： return value.length
        System.out.println(s.length());
//      char charAt(int index)： 返回某索引处的字符return value[index]
        System.out.println(s.charAt(4));
//      boolean isEmpty()：判断是否是空字符串：return value.length == 0
        System.out.println(s.isEmpty());
//      String toLowerCase()：使用默认语言环境，将 String 中的所有字符转换为小写
        System.out.println("ABC".toLowerCase());
//      String toUpperCase()：使用默认语言环境，将 String 中的所有字符转换为大写
        System.out.println(s.toUpperCase());
//      String trim()：返回字符串的副本，忽略前导空白和尾部空白
        System.out.println("  hfaf  ".trim());
//      boolean equals(Object obj)：比较字符串的内容是否相同.不是单纯比较地址，而是比较字符串内容
        System.out.println(s.equals("hello world"));
//      boolean equalsIgnoreCase(String anotherString)：与equals方法类似，忽略大小写
        System.out.println(s.equalsIgnoreCase("Hello World"));
//      String concat(String str)：将指定字符串连接到此字符串的结尾。 等价于用“+”
        System.out.println("hello".concat(" world"));
//      int compareTo(String anotherString)：比较两个字符串的大小
        System.out.println("a".compareTo("b"));  // 比较ASCII码，其实相当于a-b
//      String substring(int beginIndex)：返回一个新的字符串，它是此字符串的从beginIndex开始截取到最后的一个子字符串。
        System.out.println(s.substring(4));
//      String substring(int beginIndex, int endIndex) ：返回一个新字符串，它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
        System.out.println(s.substring(4, 5));

//      boolean endsWith(String suffix)：测试此字符串是否以指定的后缀结束
        System.out.println(s.endsWith("ld"));
//      boolean startsWith(String prefix)：测试此字符串是否以指定的前缀开始
        System.out.println(s.startsWith("he"));
//      boolean startsWith(String prefix, int toffset)：测试此字符串从指定索引开始的子字符串是否以指定前缀开始
        System.out.println(s.startsWith("ell", 1));  // 从第一个字符开始，是否以该字符串开始
//      boolean contains (CharSequence s)：当且仅当此字符串包含指定的 char 值序列时，返回 true
        System.out.println(s.contains("o"));
//      int indexOf (String str)：返回指定子字符串在此字符串中第一次出现处的索引
        System.out.println(s.indexOf("e"));
//      int indexOf (String str,int fromIndex)：返回指定子字符串在此字符串中第一次出现处的索引，从指定的索引开始
        System.out.println(s.indexOf("l", 3));
//      int lastIndexOf (String str)：返回指定子字符串在此字符串中最右边出现处的索引
        System.out.println(s.lastIndexOf("o"));
//      int lastIndexOf (String str,int fromIndex)：返回指定子字符串在此字符串中最后一次出现处的索引，从指定的索引开始反向搜索
        System.out.println(s.lastIndexOf(" ", 5));  // 只搜索了“hello ”
//      String replace(char oldChar, char newChar)：返回一个新的字符串，它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
        System.out.println(s.replace('o', 'a'));  // 替换所有字符
//      String replace(CharSequence target, CharSequence replacement)：使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
        System.out.println(s.replace("ll", "aa"));
//      String replaceAll(String regex, String replacement) ： 使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
        System.out.println(s.replaceAll("/{5,12}/", "a"));
//      String replaceFirst(String regex, String replacement) ： 使 用 给 定 的replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
//        boolean matches(String regex)：告知此字符串是否匹配给定的正则表达式。
//        String[] split(String regex)：根据给定正则表达式的匹配拆分此字符串。
//        String[] split(String regex, int limit)：根据匹配给定的正则表达式来拆分此字符串，最多不超过limit个，如果超过了，剩下的全部都放到最后一个元素中
    }

    /**
     * 字符串和其他数据类型之间的转换
     */
    @Test
    public void test2() {
//        字符串转整型
        String intString = "100";
        int i = Integer.parseInt(intString);
        System.out.println(i);
//        字符串转浮点型
        String doubleString = "12.01002";
        double v = Double.parseDouble(doubleString);
        System.out.println(v);
//        包装类 转 字符串
        String s = String.valueOf(i);
        System.out.println(s);
        String s1 = String.valueOf(v);
        System.out.println(s1);
//        字符数组转字符串
        char[] chars = {'a', 'b', 'c'};
        String s2 = new String(chars);
        System.out.println(s2);
        String s3 = new String(chars, 1, 2); // 开始， 长度
        System.out.println(s3);
//        字符串转字符数组
        char[] chars1 = s2.toCharArray();
        System.out.println(chars1);
        char[] chars2 = new char[20];
        "NIHAOSHIJIE".getChars(2, 6, chars2, 2);   // 将字符串转到char型数组上
        System.out.println(chars2);
        try {
            // 字符串转字节数组
            byte[] bytes = "helloworld".getBytes("GBK");
            byte[] bytes2 = "helloworld".getBytes(StandardCharsets.UTF_8);
            System.out.println(bytes.length);
            System.out.println(bytes2.length);
            // 字节数组转字符串
            String s4 = new String(bytes2);
            System.out.println(s4);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }


    }

}
